﻿using System;
using System.Collections.Generic;
using System.Text;

namespace Teal.Compiler {

    /// <summary>
    /// 表示一个文档注释。
    /// </summary>
    public sealed class DocComment {

        /// <summary>
        /// 获取当前文档的所有标记。
        /// </summary>
        public DocTag tags;

        /// <summary>
        /// 获取指定的标签。
        /// </summary>
        /// <param name="tagName"></param>
        /// <returns></returns>
        public DocTag this[string tagName] {
            get {
                for (DocTag tag = tags; tag != null; tag = tag.next) {
                    if (tag.name == tagName) {
                        return tag;
                    }
                }

                return null;
            }
        }

        /// <summary>
        /// 添加一个标签。
        /// </summary>
        /// <param name="tagName"></param>
        /// <returns></returns>
        public DocTag addTag(string tagName) {
            if (tags == null) {
                return tags = new DocTag() { name = tagName };
            }
            DocTag tag = tags;
            while (tag.next != null)
                tag = tag.next;

            return tag.next = new DocTag() { name = tagName };
        }

        /// <summary>
        /// 获取指定名字的全部标签。
        /// </summary>
        /// <param name="tagName"></param>
        /// <returns></returns>
        public IEnumerable<DocTag> getTags(string tagName) {
            for (DocTag tag = tags; tag != null; tag = tag.next) {
                if (tag.name == tagName) {
                    yield return tag;
                }
            }
        }
         
        /// <summary>
        /// 获取最后一个标签。
        /// </summary>
        public DocTag lastTag {
            get {
                if (tags == null) {
                    return tags = new DocTag(){name = "summary"};
                }
                DocTag tag = tags;
                while (tag.next != null) 
                 tag = tag.next;

                return tag;
            }
        }

        /// <summary>
        /// 返回表示当前 <see cref="T:System.Object"/> 的 <see cref="T:System.String"/>。
        /// </summary>
        /// <returns>
        /// 	<see cref="T:System.String"/>，表示当前的 <see cref="T:System.Object"/>。
        /// </returns>
        public override string ToString() {
            StringBuilder sb = new StringBuilder();
            for (DocTag tag = tags; tag != null; tag = tag.next) {
                sb.Append("/// @");
                sb.Append(tag.name);
                sb.Append(' ');
                sb.AppendLine(tag.value);
            }
            return sb.ToString();
        }

    }

    /// <summary>
    /// 表示一个文档标记。
    /// </summary>
    public sealed class DocTag {

        /// <summary>
        /// 支持多个对象组成一个单链表。
        /// </summary>
        public DocTag next;

        /// <summary>
        /// 当前标记的位置。
        /// </summary>
        public Location location;

        /// <summary>
        /// 获取当前标记的名字。
        /// </summary>
        public string name;

        /// <summary>
        /// 获取当前标记的内容。
        /// </summary>
        public string value;

        /// <summary>
        /// 返回表示当前 <see cref="T:System.Object"/> 的 <see cref="T:System.String"/>。
        /// </summary>
        /// <returns>
        /// 	<see cref="T:System.String"/>，表示当前的 <see cref="T:System.Object"/>。
        /// </returns>
        public override string ToString() {
            return String.Concat("@", name, " ", value);
        }

    }

}
